package br.com.sgi.bean;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import br.com.sgi.autentication.UsuarioLogado;
import br.com.sgi.model.EmailHistorico;
import br.com.sgi.model.Igreja;
import br.com.sgi.model.Membro;
import br.com.sgi.service.EmailHistoricoService;
import br.com.sgi.service.IgrejaService;
import br.com.sgi.service.MembroService;
import br.com.sgi.service.VisitanteService;
import br.com.sgi.util.Mensagem;
import br.com.sgi.util.email.EnviaEmail;
import br.com.sgi.vo.MembroVo;

/**
 * 
 * @author lucas
 * 
 */
@Scope("request")
@Controller("enviarEmailBean")
public class EnviarEmailBean extends BaseView {

	private String membro;
	private String coMembro;
	private String titulo;
	private String textoEmail;
	private String opcTpEnvio;
	private String tpEnvio;
	private String opcEnvio;
	
	private boolean exibirMensagem;
	
	private boolean exibirTable;
	
	@Autowired
	private IgrejaService igrejaService;
	
	@Autowired
	private EmailHistoricoService emailHistoricoService;

	// private List<Membro> listaMembroEnviar;
	private List<MembroVo> listaMembroEnviar;

	private MembroVo membroExcluir;
	// private Membro membroSelecionado;
	private MembroVo membroSelecionado;

	@Autowired
	private MembroService membroService;
	
	private Igreja igreja;
	
	private EmailHistorico emailHistorico;
	
	@Autowired
	private VisitanteService visitanteService;
	private List<Igreja> listaIgreja;

	public void adicionar() {
//		if (membroSelecionado.getCoSeqMembro() == null) {
//			Mensagem.addWarn("erro.MSG_12");
//		} else {
			if (!membroJaAdicionado(membroSelecionado)) {
				if (membroSelecionado.getEmail() != null && !membroSelecionado.getEmail().isEmpty()) {
					carregarHistorioEmail(membroSelecionado);
					listaMembroEnviar.add(membroSelecionado);
					membroSelecionado = new MembroVo();
					membro = "";
				} else {
					if(membroSelecionado.isJaEMembro())
						Mensagem.addWarn("erro.MSG_10", "Membro", membroSelecionado.getNome().toUpperCase());
					else
						if(membroSelecionado.getNome() != null)
							Mensagem.addWarn("erro.MSG_10", "Visitante", membroSelecionado.getNome().toUpperCase());
						else
							Mensagem.addWarn("erro.MSG_20");
					
				}

			} else {
				Mensagem.addWarn("erro.MSG_09", "Destinatário");
			}
//		}

	}

	public List<MembroVo> autocomplete(Object suggest) {
		// List<Membro> membros = null;
		List<MembroVo> membros = null;
		// if(suggest == null)
		// membros = new ArrayList<Membro>();
		if (suggest == null) {
			membros = new ArrayList<MembroVo>();
		} else {
			Membro filtro = new Membro();
			filtro.setNome(suggest.toString().toUpperCase());

			// membros = membroService.buscarMembroPorParametros(filtro,"S");
			membros = membroService.buscarMembroVisitantePorParametros(suggest.toString()
					.toUpperCase());
		}
		return membros;
	}
	
	/**
	 * Realiza o envio de email
	 */
	public void enviar() {
		String email = UsuarioLogado.getEmailIgrejaPertence();
		if (listaMembroEnviar.size() > 0) {
			for (MembroVo membro : listaMembroEnviar) {

				EnviaEmail enviaEmail = new EnviaEmail();

				enviaEmail.setDe(email);
				enviaEmail.setPara(membro.getEmail());
				enviaEmail.setAssunto(titulo);
				enviaEmail.setMensagem(textoEmail);
				enviaEmail.enviar();

				salvarEmailHistorico(textoEmail,titulo, membro.getCoSeqMembro(), membro.getNome());
			}
			limparLista();
			membroSelecionado = new MembroVo();
			membro = "";
			Mensagem.addInfo("sucesso.MSG_04");
		} else {
			Mensagem.addWarn("erro.MSG_11");
		}

	}
	
	
	
	private MembroVo carregarHistorioEmail(MembroVo membroVo){
		
		EmailHistorico emailHistorico = emailHistoricoService.buscarUltimoHistoricoEmail(membroVo.getCoMembroVisitante());
		
		membroVo.setEmailUltimoHistorico(emailHistorico);
		
		return membroVo;
		
	}
	
	public void verEmailUltimoHistirico(){
	}
	
	private void salvarEmailHistorico(String mensagem, String titulo, Long coMembro, String noMembro){
		
		EmailHistorico emailH = new EmailHistorico();
		emailH.setCoMembro(coMembro);
		if(mensagem != null && mensagem.length() > 1000)
			emailH.setMensagem(mensagem.substring(0,999));
		else
			emailH.setMensagem(mensagem);
		
		emailH.setTitulo(titulo);
		emailH.setNoMembro(noMembro);
		emailH.setDtEnvio(new Date(System.currentTimeMillis()));
		emailH.setNoUser(UsuarioLogado.getUsernameUsuarioLogado());
		emailHistoricoService.salvar(emailH);
	}

	public void excluir() {
		listaMembroEnviar.remove(membroExcluir);
	}

	public String getCoMembro() {
		return coMembro;
	}

	public List<Membro> getGrupos() {
		if (!opcEnvio.equals("PI")) {
		
			membroPorIgreja();
			
		} else if (tpEnvio.equals("TT")) {
				membroPorIgreja();
		}
		return null;
	}

	public void membroPorIgreja() {
		listaMembroEnviar = membroService.buscarMembrosPorIgrejaComEmail(igreja != null?igreja.getCoSeqIgreja():null);
		
		if(listaMembroEnviar == null)
			listaMembroEnviar = new ArrayList<MembroVo>();
		
		List<MembroVo> listTemp = visitanteService.buscarVisitantesPorIgrejaComEmail(igreja != null?igreja.getCoSeqIgreja():null);
		listaMembroEnviar.addAll(listTemp);
		
		
	}
	
	
	public void totdasIgrejas() {
		listaMembroEnviar.clear();
		igreja = null;
		if (opcEnvio.equals("TI")) {
			listaMembroEnviar = membroService.buscarMembrosPorIgrejaComEmail(null);
			
			if(listaMembroEnviar == null)
				listaMembroEnviar = new ArrayList<MembroVo>();
			
			List<MembroVo> listTemp = visitanteService.buscarVisitantesPorIgrejaComEmail(null);
			listaMembroEnviar.addAll(listTemp);
		}
	}

	public List<MembroVo> getListaMembroEnviar() {
		if (listaMembroEnviar == null) {
			if(super.getListaNiverMembroVisitante() != null && !super.getListaNiverMembroVisitante().isEmpty())
				listaMembroEnviar = super.getListaNiverMembroVisitante() ;
			else
				listaMembroEnviar = new ArrayList<MembroVo>();
		}
		return listaMembroEnviar;
	}

	public String getMembro() {
		return membro;
	}

	public MembroVo getMembroExcluir() {
		return membroExcluir;
	}

	public MembroVo getMembroSelecionado() {
		if (membroSelecionado == null) {
			membroSelecionado = new MembroVo();
		}
		return membroSelecionado;
	}

	public String getOpcTpEnvio() {
		return opcTpEnvio;
	}

	public String getTextoEmail() {
		return textoEmail;
	}

	public String getTitulo() {
		return titulo;
	}

	public String getTpEnvio() {
		return tpEnvio;
	}

	public boolean isExibirTable() {
		return exibirTable;
	}

	public void limparLista() {
		listaMembroEnviar = new ArrayList<MembroVo>();
		titulo = "";
		textoEmail = "";
	}

	// /**
	// * verifica se um membro ja foi adicionado
	// *
	// * @param membro
	// * @return
	// */
	// private boolean membroJaAdicionado(Membro membro) {
	// boolean jaExiste = false;
	// for (Membro mem : listaMembroEnviar) {
	// if (mem.getCoSeqMembro().equals(membro.getCoSeqMembro())) {
	// jaExiste = true;
	// break;
	// }
	// }
	//
	// return jaExiste;
	// }

	/**
	 * verifica se um membro ja foi adicionado
	 * 
	 * @param membro
	 * @return
	 */
	private boolean membroJaAdicionado(MembroVo membroVo) {
		boolean jaExiste = false;
		for (MembroVo mem : listaMembroEnviar) {
			if (mem.getCoMembroVisitante().equals(membroVo.getCoMembroVisitante())  ) {
				jaExiste = true;
				break;
			}
		}

		return jaExiste;
	}

	
	public void obterGrupos() {
		// if(opcTpEnvio != null && tpEnvio.equals("G")){
		getGrupos();
		// }
	}

	public void setCoMembro(String coMembro) {
		this.coMembro = coMembro;
	}

	public void setExibirTable(boolean exibirTable) {
		this.exibirTable = exibirTable;
	}

	public void setListaMembroEnviar(List<MembroVo> listaMembroEnviar) {
		this.listaMembroEnviar = listaMembroEnviar;
	}

	public void setMembro(String membro) {
		this.membro = membro;
	}

	public void setMembroExcluir(MembroVo membroExcluir) {
		this.membroExcluir = membroExcluir;
	}

	public void setMembroSelecionado(MembroVo membroSelecionado) {
		this.membroSelecionado = membroSelecionado;
	}

	public void setOpcTpEnvio(String opcTpEnvio) {
		this.opcTpEnvio = opcTpEnvio;
	}

	public void setTextoEmail(String textoEmail) {
		this.textoEmail = textoEmail;
	}

	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}

	public void setTpEnvio(String tpEnvio) {
		this.tpEnvio = tpEnvio;
	}

	/**
	 * @return the emailHistorico
	 */
	public EmailHistorico getEmailHistorico() {
		return emailHistorico;
	}

	/**
	 * @param emailHistorico the emailHistorico to set
	 */
	public void setEmailHistorico(EmailHistorico emailHistorico) {
		this.emailHistorico = emailHistorico;
	}

	/**
	 * @return the igreja
	 */
	public Igreja getIgreja() {
		return igreja;
	}

	/**
	 * @param igreja the igreja to set
	 */
	public void setIgreja(Igreja igreja) {
		this.igreja = igreja;
	}

	/**
	 * @return the opcEnvio
	 */
	public String getOpcEnvio() {
		return opcEnvio;
	}

	/**
	 * @param opcEnvio the opcEnvio to set
	 */
	public void setOpcEnvio(String opcEnvio) {
		this.opcEnvio = opcEnvio;
	}

	/**
	 * @return the exibirMensagem
	 */
	public boolean isExibirMensagem() {
		exibirMensagem =  false;
		if(listaMembroEnviar == null || listaMembroEnviar.isEmpty()){
			if(igreja != null)
				exibirMensagem = true;
			else
				if("TI".equals(opcEnvio))
					exibirMensagem = true;
		}
		
		return exibirMensagem;
	}

	/**
	 * @param exibirMensagem the exibirMensagem to set
	 */
	public void setExibirMensagem(boolean exibirMensagem) {
		this.exibirMensagem = exibirMensagem;
	}
	
	public List<Igreja> getListaIgreja() {
		if (listaIgreja == null) {
			listaIgreja = igrejaService.buscarIgrejasPorUsers();
		}
		return listaIgreja;
	}

}
